Storage drives (e.g., SSDs which stores data in units of pages and blocks, and HDDs which stores data in units of sectors and tracks) are normally comprised of one or more memory controllers and non-volatile memory. A host sends read commands to the storage drive requesting the return of a number of data blocks which are stored on the storage drive. In response to the read command, the memory controller associated with the storage drive attempts to retrieve the requested data blocks from the storage drive. Conventionally, in response to a successful read, the memory controller returns the requested data and a status indicative of a successful read. In response to a failed read, which results from a failure to read any of the requested blocks, the memory controller returns no read data, and only returns a status indicative of a failed read. If the failed read happened after a request to return a large number of data blocks, the host is given no indication which of the requested data block(s) were in error.
In this case, in response to receiving a failed status indicator, the host must take further steps to determine the location of the failed data. In conventional methods, the host either requests all the read data from other redundant drives and mechanisms such as RAID or attempts to identify the failing blocks by issuing additional multiple read commands with smaller read ranges. Alternatively, the host uses additional commands designed for drive health management to retrieve locations of failing data. Conventional methods require additional commands, extra storage space, processing time, and power resources to retrieve the failed data locations and complete the read command.
As data becomes more complex, read commands are increasingly issued for larger and larger packets of data, consisting of blocks, which in turn yield a higher likelihood of failure of the read command. Accordingly, there is an unmet demand for storage drives to be capable of handling failed read commands more efficiently.